
## vuex 实现原理及初始化过程

## vuex 是什么?
  - 答：vuex 是 vue 的状态管理器，存储的数据是响应式的。只需要把共享的值放到 vuex 中，其他需要的组件直接获取使用即可；

## Vuex 使用场景？
  - 组件状态管理麻烦时，用 vuex 让多个组件状态管理理方便
  - 小应用：简单的 store 模式即可；
  - 中大应用：modules 管理更合理

## Vuex 有哪些属性？

  - state 类似于组件中 data，存放数据
  - getters 类型于组件中 computed
  - mutations 类似于组件中 methods,同步操作
  - actions 异步代码放置区。
  - modules 把以上 4 个属性再细分，让仓库更好管理

## Vuex 是单向数据流还是双向数据流？

  - 答：Vuex 是单向数据流。

## Vuex 如何做持久化存储

  - 使用 localStorage 自己写
  - 使用 vuex-persist 插件

## Vuex 中状态存储在那里？怎么改变它

  - 答：存储在 state 中，改变 Vuex 中的状态的唯一途径就是显式地提交(commit)mutation

## Vuex 响应式原理

  - 答：是通过 new Vue 产生实例，达到响应式数据变化的目的，
  - state 作为 data 属性 $state 传入，通过 new Vue 初始化后变成响应式数据。
  - getters 本质上就是一个计算属性 computed，Vuex 内部会声明一个 computed 对象，然后将 getters 遍历成 key value 形式，添加到 computed 上，最后通过 new vue 处理

## 为什么 Vuex 的 mutation 中不能做异步操作？

  - 每个 mutation 执行完成后都会对应到一个新的状态变更，这样 devtools 就可以打个快照存下来，然后就可以实现 time-travel 了。如果 mutation 支持异步操作，就没有办法知道状态是何时更新的，无法很好的进行状态的追踪，给调试带来困难。

## vuex 的 getter 特性是什么
  - getter 可以对 state 进行计算操作，它就是 store 的计算属性，虽然在组件内也可以做计算属性，但是 getter 可以在多给件之间复用，如果一个状态只在一个组件内使用，是可以不用 getters
